package com.tlgen.orm.components.fast;

import com.tlgen.orm.config.SpeedOrmConfig;
import com.tlgen.orm.model.DataResult;
import com.tlgen.orm.utils.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.DispatcherType;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.util.Optional;

import static com.tlgen.orm.constant.HttpConstant.ORIGINAL_REQUEST_URI;
import static com.tlgen.orm.utils.http.HttpUtils.writeResponse;
import static com.tlgen.orm.utils.orm.FastModeUtils.isFastModePath;
import static com.tlgen.orm.utils.orm.FastModeUtils.processFastMode;

@Slf4j
public class FastModeInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 只在首次请求时处理
        if (request.getDispatcherType() != DispatcherType.REQUEST) {
            return true; // 放行错误、包含等其他类型的调度
        }
        // 保存原始请求路径
        request.setAttribute(ORIGINAL_REQUEST_URI, request.getRequestURI());
        try {
            // 检查是否启用快速模式
            SpeedOrmConfig speedOrmConfig = SpringUtils.getBean(SpeedOrmConfig.class);
            String originalUri = (String) request.getAttribute(ORIGINAL_REQUEST_URI);
            if (speedOrmConfig.getFastMode() && isFastModePath(originalUri)) {
                // 处理快速模式
                DataResult result = processFastMode(request);
                // 返回快速模式响应
                writeResponse(response, Optional.ofNullable(result)
                        .map(DataResult::getData)
                        .orElse(null));
                // 拦截器处理完成, 不再继续处理
                return false;
            }
        } catch (Exception e) {
            log.error("FastModeInterceptor error:", e);
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在 Controller 方法调用后、视图渲染前执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后执行，通常用于资源清理等操作
    }

}
